使用 React 開發
最簡單的方式是使用官方做的 boilerplate 來做 project 的 init,就算不懂前面的 webpack 也可以寫網頁
安裝 npx
npm install -g npx
安裝 yarn 要先依據環境把 yarn 這個套件裝起來
照著文件創建一個 App
npx create-react-app react-todo-list
但是出現了錯誤訊息
error eslint@5.6.0: The engine "node" is incompatible with this module. Expected version "^6.14.0 || ^8.10.0 || >=9.10.0".
使用 nvm 來設定 node 版本
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
下載 node 8.10.0
nvm install 8.10.0
--
$ node -v
v8.10.0
再 init 一次
出現這個代表成功了!
We suggest that you begin by typing:
cd react-todo-list
yarn start
Happy hacking!
如果想知道他的 webpack config 可以使用 eject
來脫離 react-script 隱藏的設定,之後就可以自行地去改動 config
底下 webpack
的設定
yarn eject
之前的 TodoList 版本像是這樣
現在用 react 做完應該也要長這樣
TodoList 已經使用 Bootstrap 做出來了,現在也想要有同樣的 theme
搜到一個 github 上星星數還滿多的就來試用看看
npm install bootstrap --save
npm install --save reactstrap
可以先畫出圖,然後在上面切出功能像是這樣
這樣子規劃出
Header
Action
List
開發目錄會像這樣
在 index.js
加入自定義的 scss
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import './styles/main.scss'
ReactDOM.render(<App />, document.getElementById('root'));
開啟 dev server
會發現壞掉了
原因是 react-script 沒有幫忙安裝 node-sass
這邊一定要用 yarn 裝
yarn add node-sass
在 App.js 進行開發
清掉一開始的 example code
加上以下
import React, { Component } from 'react';
import NavHeader from './container/NavHeader';
import AppContainer from './container/AppContainer';
class App extends Component {
render() {
return (
<>
<NavHeader />
<AppContainer />
</>
);
}
}
export default App;
在 AppConatiner
中進行開發
index.js
import React from 'react';
import ActionController from './ActionController';
import TodoList from './TodoList';
class Container extends React.Component {
render() {
return (
<div className="container">
<ActionController />
<TodoList />
</div>
)
}
}
export default Container;
列表
import React from 'react';
import TodoItem from './TodoItem';
class TodoList extends React.Component {
render() {
const {
list
} = this.props;
return (
<ul>
{
list.map((item) => (
<TodoItem key={item.id} item={item} />
))
}
</ul>
)
}
}
TodoList.defaultProps = {
list: [{
id: 1,
checked: false,
name: 'test'
}, {
id: 2,
checked: true,
name: 'done'
}]
}
export default TodoList;
TodoItem
import React from 'react';
const getCheckedClass = (checked) => checked ? 'list-group-item-dark' : '';
const TodoItem = (props) => {
const {
item,
} = props;
return (
<li className={`list-group-item list-group-item-action ${getCheckedClass(item.checked)}`}>
<span className="todo-content">{item.name}</span>
<span className="close">x</span>
</li>
);
}
export default TodoItem;
會發現跟之前寫得很像,就差在模組分得很開,做的事情很專一
目前還不會動,因為沒有加入但整體上已經有感覺了
而且將之前想的介面整合進來十分的輕鬆,比較麻煩的就是 Bootstrap 那邊
明天繼續把它後續給完成吧!
今天的 code